工厂模式
Java中常用的设计模式,工厂可以说为我们提供产品的服务,主要方便我们创建对象。
优点:灵活的控制生产过程,可扩展性高,在工厂中控制权限、添加日志、修饰。
1.简单工厂模式
1.创建一个抽象类或接口
java
public interface Animal {
public void eat();
}
2.创建具体类
java
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("吃狗粮");
}
}
3.创建一个简单工厂类
java
public class AnimalFactory {
public Cat createCat(){
return new Cat();
}
public Dog createDog(){
return new Dog();
}
}
3.工厂方法模式
1.创建一个抽象类或接口
java
public interface Animal {
public void eat();
}
2.创建具体类
java
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("吃狗粮");
}
}
3.创建工厂类
java
public class CatFactory {
public Cat createCat(){
return new Cat();
}
}
public class DogFactory {
public Dog createDog(){
return new Dog();
}
}
缺点:
类的数量增加:在工厂方法模式中,每个具体产品都对应一个具体工厂类。如果系统中存在大量的产品类型,就会导致产生大量的具体工厂类,增加了类的数量,使得系统更加复杂。
客户端需要知道具体工厂类:在工厂方法模式中,客户端需要直接使用具体工厂类来创建产品对象。这使得客户端与具体工厂类之间产生了耦合,违背了依赖倒置原则。
需要维护和管理工厂类:每个具体工厂类都需要负责创建对应的产品对象。如果有多个具体工厂类,就会增加维护和管理的复杂性。
3.抽象工厂模式
使用场景:当需要创建一组相关或相互依赖的产品对象时,可以使用抽象工厂模式。这些产品对象之间存在一定的逻辑关系,需要一起使用或者配合使用;当希望客户端与具体产品的实现解耦,只与抽象工厂和抽象产品进行交互时,可以使用抽象工厂模式。这样可以隐藏具体产品的实现细节,提供灵活的产品切换和扩展。
1.定义抽象产品
java
public interface IFood {
public void eat();
}
public interface IHand {
public void take();
}
2.定义具体产品
java
class Food extends AbstractFood{
@Override
public void eat() {
System.out.println("吃猫粮");
}
}
java
public class Hand extends AbstracatHand{
@Override
public void take() {
System.out.println("take ...");
}
}
3.定义抽象工厂
java
public abstract class ModelFactory {
public abstract Food createFood();
public abstract Hand createHand();
}
4.定义具体工厂
java
public class Factory extends ModelFactory{
@Override
public Food createFood() {
return new Food();
}
@Override
public Hand createHand() {
return new Hand();
}
}