Loading

工厂模式简单理解

工厂模式

通俗理解

工厂模式简单来说,就是代替new关键字,分为三种基本工厂:简单工厂、工厂方法、抽象工厂。

使用场景

不想直接new对象,如果类改变,需要改代码,如果依赖该类的很多,那将是很痛苦的事情

简单工厂

最简单的对象创建管理方式,对不同的对象进行了一次封装,根据传递类型来执行需要创建的对象;将实现逻辑抽离出去,该类只做调用。使用场景:分类稳定的情况下是可以使用简单工厂的(calendar的源码中也用到了简单工厂),例如:

1、抽象产品类:

public interface IComputer {
     //生产电脑
     void method();
 }

2、产品A实现类:

 public class HuaWeiIComputer implements IComputer {
     @Override
     public void method() {
         //生产华为电脑
     }
 }

3、产品B实现类:

 public class AppleIComputer implements IComputer {
     @Override
     public void method() {
         //生产苹果电脑
     }
 }

4、简单工厂(通过key判断,不太好,可是考虑试试反射):

public IComputer getService(String type) {
     IComputer service = null;
     if ("A".equals(type)) {
         service = new HuaWeiIComputer();
     }
     if ("B".equals(type)) {
         service = new AppleIComputer();
     }
     //生产电脑
     service.method();
     return service;
 }

5、如果新增一个产品类型,则需要修改工厂方法,违反开闭原则,于是引出工厂方法模式。

6、如果采用反射来实现,则如下:

//工厂类  
class Factory1{  
    public Object getAnimal(String className) throws Exception{  
        Class<?> cls = Class.forName(className);  
        Object obj = cls.newInstance();  
        return obj;  
    }  
}  
//测试类  
public class ReflectFactory {  
    public static void main(String[] args) throws Exception{  
        Factory1 factory = new Factory1();  
        Animal an = (Animal)factory.getAnimal("com.qcjy.factory.Man1");  
        an.speak();  
    }  
}

工厂方法

工厂方法模式会将每个产品都创建一个自己的工厂,然后再根据抽象工厂去实现每个派生类的工厂;

1、产品接口:

public interface Fruit {
    void getFruitName();
}

2、产品抽象工厂:

public interface FruitFactory {
    Fruit getFruit();
}

3、产品实现:

public class Apple implements Fruit {
    @Override
    public void getFruitName() {
        System.out.println("苹果");
    }
}
public class Orange implements Fruit {
    @Override
    public void getFruitName() {
        System.out.println("橘子");
    }
}

4、单独产品工厂:

public class AppleFactory implements FruitFactory {
    @Override
    public Fruit getFruit() {
        return new Apple();
    }
}

public class OrangeFactory implements FruitFactory {
    @Override
    public Fruit getFruit() {
        return new Orange();
    }
}

5、测试

public class Client {
    public static void main(String[] args) {
        //使用工厂创建对象,而不需通过new实例对象:
        Fruit fruit1 = new AppleFactory().getFruit();
        Fruit fruit2 = new OrangeFactory().getFruit();
        fruit1.getFruitName();
        fruit2.getFruitName();
    }
}

抽象工厂模式

抽象工厂主要实现的是一类产品,一种同类型的产品;通过在抽象工厂中增加创建产品的接口,并在具体子工厂中实现新加产品的创建;

抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;

抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

抽象工厂 - 廖雪峰的官方网站 (liaoxuefeng.com)

posted @ 2022-06-21 15:18  秦一居  阅读(113)  评论(0)    收藏  举报