Java设计模式——工厂模式 (2)

简单工厂类图:

Java设计模式——工厂模式

工厂方法

工厂方法模式(FactoryMethodPattern)是指定义一个创建对象的接口(工厂接口),但让实现这个
接口的类(工厂具体实现类)来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

现代化管理都是明确分工、专人干专事、团队协作。咱们的程序代码意思一样的。

来一个水果工厂接口

/** * @description: 水果工厂接口 * @author: lmc * @create: 2019-03-20 20:14 **/ public interface IFruitsFactory { /** * 工厂的生产方法 * @return IFruits */ IFruits product(); } /** * @description: 苹果工厂 * @author: lmc * @create: 2019-03-20 20:19 **/ public class AppleFactory implements IFruitsFactory { @Override public IFruits product() { System.out.println("苹果工厂只生产苹果"); return new Apple(); } } /** * @description: 香蕉工厂 * @author: lmc * @create: 2019-03-20 20:19 **/ public class BananaFactory implements IFruitsFactory { @Override public IFruits product() { System.out.println("香蕉工厂只生产香蕉"); return new Banana(); } } /** * @description: 橙子工厂 * @author: lmc * @create: 2019-03-20 20:19 **/ public class OrangeFactory implements IFruitsFactory { @Override public IFruits product() { System.out.println("橙子工厂只生产橙子"); return new Orange(); } } /** * @description: 工厂方法测试 * @author: lmc * @create: 2019-03-20 20:39 **/ public class MethodFactoryTest { public static void main(String[] args) { IFruitsFactory iFruitsFactory= new AppleFactory(); iFruitsFactory.product().getName(); iFruitsFactory = new BananaFactory(); iFruitsFactory.product().getName(); iFruitsFactory = new OrangeFactory(); iFruitsFactory.product().getName(); } }

运行结果:

苹果工厂只生产苹果 我是苹果,水果的一种 香蕉工厂只生产香蕉 我是香蕉,水果的一种 橙子工厂只生产橙子 我是橙子,水果的一种

专人做专事,具体的对象只有具体的工厂创建。用户只有选择权,不需要传入参数。对象的实例化推迟到了工厂实现类创建。

利:

专人专事,遵循单一原则,子类工厂实现具体业务。让业务更清晰

遵循开闭原则,新增业务,只需要添加产品类和具体的产品工厂类就可以了,增加产品扩展性。

新增草莓产品,我只需要新增草莓类和草莓工厂就可以了。

弊:

类的个数容易过多,增加复杂度。

增加了系统的抽象性和理解难度。

工厂方法模式类图

Java设计模式——工厂模式

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类。客户端(应用层)不依赖于产品类实例如何被创建、实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

现在了解下上面提到的产品族和产品等级结构的概念。

产品族:属于一个产品工厂的所有产品。

产品等级结构:不等产品工厂生产的相同的同类产品。

Java设计模式——工厂模式

Java设计模式——工厂模式

现在水果工厂需求再次升级,之前又一个水果接口 IFruits ,那么我们再增加 水果果干接口IDriedFruits 、水果果汁接口 IJuice

/** * @description: 水果干产品接口 * @author: lmc * @create: 2019-03-19 21:28 **/ public interface IDriedFruits { void getName(); void getColor(); void getTaste(); } /** * @description: 水果果汁品接口 * @author: lmc * @create: 2019-03-19 21:28 **/ public interface IJuice { void getName(); void getColor(); void getTaste(); }

现在我们有实现类 苹果汁 AppleJuice 、 苹果干 DriedApple ......

/** * @description: 苹果干 * @author: lmc * @create: 2019-03-19 21:33 **/ public class DriedApple implements IDriedFruits { @Override public void getName() { System.out.println(" 我是苹果干,果干的一种"); } @Override public void getColor() { System.out.println(" 苹果干大概也是白色的吧"); } @Override public void getTaste() { System.out.println(" 苹果干没吃过,打个也是酸酸的吧"); } } /** * @description: 苹果汁 * @author: lmc * @create: 2019-03-19 21:33 **/ public class AppleJuice implements IJuice { @Override public void getName() { System.out.println(" 我是苹果汁,果汁的一种"); } @Override public void getColor() { System.out.println(" 苹果汁大概是白色的吧"); } @Override public void getTaste() { System.out.println(" 苹果汁酸酸的"); } } /** * @description: 香蕉干 * @author: lmc * @create: 2019-05-23 23:06 **/ public class DriedBanana implements IDriedFruits { @Override public void getName() { System.out.println(" 我是香蕉干,果干的一种"); } @Override public void getColor() { System.out.println(" 香蕉干大概也是黄色的吧"); } @Override public void getTaste() { System.out.println(" 香蕉干甜甜的"); } } /** * @description: 香蕉汁 * @author: lmc * @create: 2019-05-23 23:10 **/ public class BananaJuice implements IJuice { @Override public void getName() { System.out.println(" 我是香蕉汁,果汁的一种"); } @Override public void getColor() { System.out.println(" 香蕉汁大概是白色的吧"); } @Override public void getTaste() { System.out.println(" 香蕉汁甜甜的"); } } /** * @description: 橙子干 * @author: lmc * @create: 2019-05-23 23:08 **/ public class DriedOrange implements IDriedFruits{ @Override public void getName() { System.out.println(" 我是橙子干,果干的一种"); } @Override public void getColor() { System.out.println(" 橙子干大概也是橙黄色的吧"); } @Override public void getTaste() { System.out.println(" 香蕉干没吃过 应该是甜甜的"); } } /** * @description: 橙汁 * @author: lmc * @create: 2019-05-23 23:12 **/ public class OrangeJuice implements IJuice { @Override public void getName() { System.out.println(" 我是橙汁,果汁的一种"); } @Override public void getColor() { System.out.println(" 橙汁是橙色的吧"); } @Override public void getTaste() { System.out.println(" 橙汁汁酸酸甜甜的"); } }

工厂类改造

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygyyp.html