简单工厂模式指的是静态工厂模式,它就是通过传进来的参数,来具体决定创建哪一个产品类的实例。这些产品类又继承自一个父类或者是接口。就是将一个具体类的实例化交给一个静态工厂方法来执行。
工厂角色:被外界直接调用,负责创建所有具体产品类的实例。
抽象产品角色:是所有的具体产品角色的父类,定义了它们的公共接口
具体产品角色:继承自抽象产品角色,一般有多个,是工厂角色创建的目标。
当工厂类负责创建的对象比较少,不会造成工厂类业务逻辑太复杂。客户端只需要传入工厂类参数就可以了,不需要关心创建的具体过程。
工厂模式特点:
1.工厂类负责创建的对象比较少,不会造成工厂类业务逻辑太复杂。
2.客户端只需要传入工厂类参数就可以了,不需要关心创建的具体过程
工厂方法模式:
1.客户端不知道它所需要的对象的类。
2.抽象工厂类通过其子类来指定创建哪个对象。
简单工厂模式:我们只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作。
策略模式:必须首先创建一个想使用的类对象,然后将该对象最为参数传递进去,通过该对象调用不同的算法。
简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。
说白了就是一个在内部去选去创建。后者则是先进行选取创建好了之后再作为参数传进去。
优点:
外界不需要创建具体那个产品,只需要消耗产品就可以了,明确了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:
1.因为工厂类集中了所有对象的创建逻辑,违反了开闭原则。
2.如果需要添加新的类,工厂方法也需要修改,这种条件判断和产品类型判断交错在一起的方式,对系统维护和扩展非常不利。
开闭原则定义:
对扩展开放,对修改关闭。我的具体理解如下:
当你去创建一个模块的时候应该尽可能的写的足够好,以后需要增加新的功能,不应该去更改已经写过的模块,而是去增加一个新的模块。也就是功能的扩展,应该是写新的java代码,而不是去修改原有的代码。
public abstract class ApplePhone { /** * 苹果手机类 */ protected abstract void getSize(); }
public class IphoneX extends ApplePhone{ @Override protected void getSize() { System.out.println("3.5英寸"); } }
public class IphoneXR extends ApplePhone{ @Override protected void getSize() { System.out.println("5.5英寸"); } }
public class IphoneXS extends ApplePhone{ @Override protected void getSize() { System.out.println("4.5英寸"); } }
public class AppleFactory { public static ApplePhone createPhone(String model){ ApplePhone applePhone = null; switch (model){ case "iPhoneX": applePhone = new IphoneX(); break; case "iPhoneXs": applePhone = new IphoneXS(); break; case "iPhoneXr": applePhone = new IphoneXR(); break; default: break; } return applePhone; } }
public class Test { public static void main(String[] args) { ApplePhone applePhone; applePhone = AppleFactory.createPhone("iPhoneX"); applePhone.getSize(); applePhone = AppleFactory.createPhone("iPhoneXs"); applePhone.getSize(); applePhone = AppleFactory.createPhone("iPhoneXr"); applePhone.getSize(); } }
1.对象的创建与对象的使用过程分离。
2.当你需要什么,只需要传入一个正确的参数,根据参数的不同返回不同类的实例,无须知道其创建细节。
3.专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
4.工厂类不够灵活。
5.工厂类负责创建的对象比较少。
原文:https://www.cnblogs.com/yaoyaoo/p/14312937.html