简单工厂模式
-
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
-
简单工厂模式是工厂模式家族中最简单实用的模式
-
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
-
在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.
-
手机制造顶层接口
public interface Phone { void make(); }
-
小米制造商
public class XiaoMiPhone implements Phone { @Override public void make() { System.out.println("制造了一台小米手机"); } }
-
华为制造商
public class HuaWeiPhone implements Phone{ @Override public void make() { System.out.println("制造了一台华为手机"); } }
-
手机制造代工厂(富士康)
public class PhoneFactory { public Phone makePhone(String phoneType){ if ("xiaomi".equals(phoneType)){ return new XiaoMiPhone(); }else if ("huawei".equals(phoneType)){ return new HuaWeiPhone(); } return null; } }
-
用户需求方
public class TestMain { public static void main(String[] args) { PhoneFactory phoneFactory = new PhoneFactory(); Phone xiaomi = phoneFactory.makePhone("xiaomi"); xiaomi.make(); Phone huawei = phoneFactory.makePhone("huawei"); huawei.make(); } }
-
类图如下所示
工厂方法模式
-
和简单工厂模式相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,而不是由一个大工厂聚合生产
-
Phone 、XiaoMiPhone、HuaWeiPhone 类的不变
-
新增抽象工厂类、小米工厂类、华为工厂类即可
-
抽象工厂累
public interface AbstractFactory { Phone makePhone(); }
-
小米工厂类
public class XiaoMiFactory implements AbstractFactory { @Override public Phone makePhone() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致 return new XiaoMiPhone(); } }
-
华为工厂类
public class HuaWeiFactory implements AbstractFactory{ @Override public Phone makePhone() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致 return new HuaWeiPhone(); } }
-
用户需求方
public class TestMain { public static void main(String[] args) { AbstractFactory xiaoMiFactory = new XiaoMiFactory(); AbstractFactory huaWeiFactory = new HuaWeiFactory(); Phone xiaomi = xiaoMiFactory.makePhone(); Phone huawei = huaWeiFactory.makePhone(); xiaomi.make(); huawei.make(); } }
-
类图如下所示
抽象工厂模式
-
定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
-
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
-
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)
-
将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
-
上面的工厂模式都是在围绕手机在生产,如果这个时候,我们添加一个PC领域进去该如何玩呢?
-
手机制造顶级接口
public interface Phone { void make(); }
-
小米手机制造商
public class XiaoMiPhone implements Phone { @Override public void make() { System.out.println("制造了一台小米手机"); } }
-
华为手机制造商
public class HuaWeiPhone implements Phone { @Override public void make() { System.out.println("制造了一台华为手机"); } }
-
笔记本制造顶级接口
public interface PC { void make(); }
-
小米笔记本制造商
public class XiaoMiPC implements PC{ @Override public void make() { System.out.println("生产了一台小米笔记本"); } }
-
华为笔记本制造商
public class HuaWeiPC implements PC{ @Override public void make() { System.out.println("生产了一台华为笔记本"); } }
-
代工厂顶级接口
public interface AbstractFactory { Phone makePhone(); PC makePC(); }
-
小米代工厂制造接口
public class XiaoMiFactory implements AbstractFactory { @Override public Phone makePhone() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致 return new XiaoMiPhone(); } @Override public PC makePC() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致 return new XiaoMiPC(); } }
-
华为代工厂制造接口
public class HuaWeiFactory implements AbstractFactory { @Override public Phone makePhone() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致 return new HuaWeiPhone(); } @Override public PC makePC() { // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。 // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致 return new HuaWeiPC(); } }
-
需求方
public class TestMain { public static void main(String[] args) { AbstractFactory xiaoMiFactory = new XiaoMiFactory(); AbstractFactory huaWeiFactory = new HuaWeiFactory(); Phone xiaomi = xiaoMiFactory.makePhone(); PC xiaomiPC = xiaoMiFactory.makePC(); Phone huawei = huaWeiFactory.makePhone(); PC huaweiPC = huaWeiFactory.makePC(); xiaomi.make(); xiaomiPC.make(); huawei.make(); huaweiPC.make(); } }
-
类图如下所示
-
此时,如果我们觉得手机和笔记本都已经玩腻了,想进军造车行业
-
定义造成顶级接口
-
定义造车品牌实现接口,比如小鹏汽车,蔚来汽车等
-
此时增加代工顶级接口一个允许生产汽车的行为,并写一个汽车代工厂即可工厂
-
扩展性就大大的增加了
-
工厂模式小结
-
工厂模式的意义
-
将实例化对象的代码提取出来,放到一个类中统一管理维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
-
-
三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
-
设计模式的依赖抽象原则
-
创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回
-
不要让类继承具体类,而是继承抽象类或者是实现 interface(接口)
-
Ø 不要覆盖基类中已经实现的方法。
-