1.抽象工厂测试 == 具体工厂类实现不同电脑组件的生产
package com.zhaoshuangjian.mode03_抽象工厂模式; import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang01Factory; import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang02Factory; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse; /** * <p>抽象工厂测试 == 具体工厂类实现不同电脑组件的生产</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 * * * 工厂方法模式: * 一个抽象产品类,可以派生出多个具体产品类。 * 一个抽象工厂类,可以派生出多个具体工厂类。 * 每个具体工厂类只能创建一个具体产品类的实例。 * * 抽象工厂模式: * 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 * 一个抽象工厂类,可以派生出多个具体工厂类。 * 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。 * * 区别: * 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 * 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 * ===================================================================== * 工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发, * 你的代码很可能大部分都放在了产品的构造和初始化这些细节上面。也因为如此, * 类似的产品之间有很多可以复用的特征,所以会和模版方法相随。 * * 抽象工厂需要创建一系列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发, * 你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。 * */ public class AbstractFactoryTest { public static void main(String[] args) { // 用户需要购买联想的电脑,但要求键盘和鼠标都是雷柏的,于是便找到了对应的01电脑组装工厂进行生产 LianXiang01Factory lianXiang01Factory = new LianXiang01Factory(); ProduceKeyBord keybord1 = lianXiang01Factory.createKeyBord(); keybord1.produceKeyBord("M550", "黑色"); ProduceMouse Mouse1 = lianXiang01Factory.createMouse(); Mouse1.produceMouse("M590", "有线"); System.out.println("=======================分割线,注意区别"); // 用户需要购买联想的电脑,但要求键盘是雷柏的,鼠标是罗技的,于是便找到了对应的02电脑组装工厂进行生产 LianXiang02Factory lianXiang02Factory = new LianXiang02Factory(); ProduceKeyBord keybord2 = lianXiang02Factory.createKeyBord(); keybord2.produceKeyBord("M550", "黑色"); ProduceMouse Mouse2 = lianXiang02Factory.createMouse(); Mouse2.produceMouse("M590", "无线"); /** * 好处:横向扩展很容易,如果我需要再增加一个电脑型号的生产线,比如HP【惠普】,只需要在创建一个对应的工厂实现抽象工厂即可 * 坏处:纵向扩展很麻烦,如果我需要增加显示器的生产接口,那么改动的地方就太多了,自己领会吧,可以尝试一下 */ } }
2.联想电脑生产商 == 电脑型号01【固定键盘和鼠标生产商】
package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory; import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord; import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LeiBoMouse; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse; /** * <p>联想电脑生产商 == 电脑型号01【固定键盘和鼠标生产商】</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LianXiang01Factory implements ComputerAbstractFactory { @Override public ProduceKeyBord createKeyBord() { // 使用雷柏的键盘 return new LeiBoKeyBord(); } @Override public ProduceMouse createMouse() { // 使用雷柏的鼠标 return new LeiBoMouse(); } }
3.联想电脑生产商 == 电脑型号:02【固定键盘和鼠标生产商】
package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory; import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord; import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LuoJiMouse; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse; /** * <p>联想电脑生产商 == 电脑型号:02【固定键盘和鼠标生产商】</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LianXiang02Factory implements ComputerAbstractFactory { @Override public ProduceKeyBord createKeyBord() { // 使用雷柏的键盘 return new LeiBoKeyBord(); } @Override public ProduceMouse createMouse() { // 使用罗技的鼠标 return new LuoJiMouse(); } }
4.雷柏(Rapoo)键盘生产商
package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord; /** * <p>雷柏(Rapoo)键盘生产商</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LeiBoKeyBord implements ProduceKeyBord { @Override public void produceKeyBord(String name, String color) { System.out.println("雷柏键盘 -- "+name+","+color); } }
5.罗技(G)键盘生产商
package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord; /** * <p>罗技(G)键盘生产商</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LuoJiKeyBord implements ProduceKeyBord { @Override public void produceKeyBord(String name, String color) { System.out.println("罗技键盘 -- "+name+","+color); } }
6.computer抽象工厂接口-只提供电脑组件的组装,具体组装成什么样的型号的电脑,再由具体工厂类决定
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03; /** * computer抽象工厂接口-只提供电脑组件的组装,具体组装成什么样的型号的电脑,再由具体工厂类决定 * * @Auther: zhaoshuangjian 2023-03-23 下午1:37 */ public abstract interface ComputerAbstractFactory { ProduceKeyBord createKeyBord(); ProduceMouse createMouse(); }
7.键盘接口 – 生产键盘
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03; /** * <p>键盘接口 -- 生产键盘 </p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public interface ProduceKeyBord { /** * 约定键盘生产的规格数据 * @param name 名称 * @param color 颜色 */ public void produceKeyBord(String name,String color); }
8.鼠标接口 – 生产鼠标
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03; /** * <p>鼠标接口 -- 生产鼠标</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public interface ProduceMouse { /** * 约定鼠标生产的规格数据 * @param name 名称 * @param type 类型 */ public void produceMouse(String name,String type); }
9.雷柏(Rapoo)鼠标生产商
package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse; /** * <p>雷柏(Rapoo)鼠标生产商</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LeiBoMouse implements ProduceMouse { @Override public void produceMouse(String name, String type) { System.out.println("雷柏鼠标 -- "+name+","+type); } }
10.罗技(G)鼠标生产商
package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse; import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse; /** * <p>罗技(G)鼠标生产商</p> * * @Author zhaoshuangjian 2023-03-23 下午1:37 */ public class LuoJiMouse implements ProduceMouse { @Override public void produceMouse(String name, String type) { System.out.println("罗技鼠标 -- "+name+","+type); } }