java工厂模式-简单工厂,工厂方法,抽象工厂模式

xiaoxiao2021-02-28  104

开篇:

1.学习心得,方便以后能回看,其他看到的一起共勉,有不正之处望不吝赐教。

2.下文所提到的“无能为力”指的都是在不修改原有业务逻辑代码的情况下,增加新的功能。这也是java抽象类,接口,或者继承 这些概念或设计思想提出来的初衷(自己理解的)。

3.下文的理解都是针对产品族和等级结构理解的。产品:例如,有两家生产相同东西的厂商,intel和AMD,都生产cpu和芯片,这时候每家的具体生产的东西()这里是cpu和芯片)就叫做  产品,两家的cpu统称同一个等级结构,一家的所有产品称之为产品族,

3.首先要明白,写程序不是为了应用设计模式而应用,而是根据实际业务场景选择最适合的设计模式,如果没必要,则不需要勉强使用。

4.代码写的别人看不懂有两种解释:a。确实是大牛,代码太高深,看不懂。b。装逼专用,其实没啥用(瞎扯的,可忽略)

正文:

三个模式的初步理解

简单工厂:生产同意等级结构中的任意产品(对于新增产品,无能为力)

工厂方法:生产同一等级结构的固定产品。可以增加任意产品。

抽象工厂:生产不同产品族的全部产品。(对于新增产品,无能为力;支持增加产品族。应用场景增加产品线,开分公司)

建模:

简单工厂:

工厂方法:

抽象工厂:

源码实现:

简单工厂:

/** * @ClassName: Cpu * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:38:18 * @Company: * */ public interface Cpu { public void calculate(); } /** * @ClassName: AmdCpu * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:39:20 * @Company: * */ public class AmdCpu implements Cpu { @Override public void calculate() { System.out.println("AMD cpu."); } } /** * @ClassName: IntelCpu * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:39:20 * @Company: * */ public class IntelCpu implements Cpu { @Override public void calculate() { System.out.println("intel cpu."); } } /** * @ClassName: SimpleFactory * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:34:38 * @Company: * */ public class SimpleFactory { public static Cpu createCpu(int type) { Cpu cpu = null; if (type == 1) { cpu = new IntelCpu(); } else if (type == 2) { cpu = new AmdCpu(); } return cpu; } public static void main(String[] args) { Cpu cpu = createCpu(1); cpu.calculate(); } }输出:intel cpu.

工厂方法:

/** * @ClassName: MethodFactory * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:46:08 * @Company: * */ public interface MethodFactory { public Product create(); } /** * @ClassName: CpuFactory * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:53:01 * @Company: * */ public class CpuFactory implements MethodFactory{ @Override public Product create() { return new CpuProduct(); } } /** * @ClassName: CpuFactory * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:53:01 * @Company: * */ public class MainBoardFactory implements MethodFactory { @Override public Product create() { return new MainBoardProduct(); } } /** * @ClassName: Product * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:47:10 * @Company: * */ public interface Product { public void intel(); public void amd(); } /** * @ClassName: CpuProduct * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:50:39 * @Company: * */ public class CpuProduct implements Product { @Override public void intel() { System.out.println("this is intel cpu"); } @Override public void amd() { System.out.println("this is amd cpu"); } } /** * @ClassName: CpuProduct * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:50:39 * @Company: * */ public class MainBoardProduct implements Product { @Override public void intel() { System.out.println("this is intel mainboard"); } @Override public void amd() { System.out.println("this is amd mainboard"); } } /** * @ClassName: MethoFactoryTest * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午1:54:23 * @Company: * */ public class MethoFactoryTest { /** * 功能描述: * @Title: main * @author yanfei.li * @date 2017年6月8日 下午1:54:23 * @param args * @return void * @throws */ public static void main(String[] args) { MethodFactory factory = new CpuFactory(); Product product = factory.create(); product.amd(); product.intel(); } }输出:

this is amd cpu this is intel cpu

抽象工厂:

/** * @ClassName: AbstractFactory * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午2:00:35 * @Company: * */ public interface AbstractFactory { public Intel intel(); public Amd amd(); } /** * @ClassName: FactoryA * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午2:07:55 * @Company: * */ public class FactoryA implements AbstractFactory{ public Intel intel(){ return new IntelA(); } public Amd amd(){ return new AmdA(); } } /** * @ClassName: ProductA * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午2:07:02 * @Company: * */ public interface Amd { public void cpu(); public void mainBoard(); } /** * @ClassName: ProductA1 * @Description: AMD的其中一个子公司 * @author yanfei.li * @date 2017年6月8日 下午2:10:08 * @Company: * */ public class AmdA implements Amd { @Override public void cpu() { System.out.println("this is amdA cpu"); } @Override public void mainBoard() { System.out.println("this is amdA mainBoard"); } } /** * @ClassName: ProductA * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午2:07:02 * @Company: * */ public interface Intel { public void cpu(); public void mainBoard(); } /** * @ClassName: ProductA1 * @Description: Intel的其中一个子公司 * @author yanfei.li * @date 2017年6月8日 下午2:10:08 * @Company: * */ public class IntelA implements Intel { @Override public void cpu() { System.out.println("this is intelA cpu"); } @Override public void mainBoard() { System.out.println("this is intelA mainBoard"); } } /** * @ClassName: AbstractFactoryTest * @Description: TODO * @author yanfei.li * @date 2017年6月8日 下午2:10:53 * @Company: * */ public class AbstractFactoryTest { /** * 功能描述: * @Title: main * @author yanfei.li * @date 2017年6月8日 下午2:10:53 * @param args * @return void * @throws */ public static void main(String[] args) { AbstractFactory factory = new FactoryA(); Amd amd = factory.amd(); amd.cpu(); amd.mainBoard(); } }运行结果:

this is amdA cpu this is amdA mainBoard 总结:

1.发现工厂方法和抽象工厂完全是不同维度的相同实现,工厂方法是面向等级结构的,抽象工厂是面向产品族的

2.在不改变原有业务逻辑代码的情况下,普通工厂写死了,其他两种都可以扩展,只是扩展的维度不一样

3.应用场景上,抽象工厂:例如,我要发送邮件,可以选择不同的邮件厂商,就可以做成抽象工厂,没增加一个厂商,就写一次实现,原有业务代码不会改变。其他两种类似。

4.暂时想到这些,欢迎补充,如果理解不到位,欢迎指正,蟹蟹

参考的博客: http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

http://blog.csdn.net/superbeck/article/details/4446177

转载请注明原文地址: https://www.6miu.com/read-77625.html

最新回复(0)