工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式。
简单工厂
Phone类:手机标准规范类(AbstractProduct)
public interface Phone {void make();}
MiPhone类:制造小米手机(Product1)
public class MiPhone implements Phone {public MiPhone() {this.make();}@Overridepublic void make() {// TODO Auto-generated method stubSystem.out.println("make xiaomi phone!");}}
IPhone类:制造苹果手机(Product2)
public class IPhone implements Phone {public IPhone() {this.make();}@Overridepublic void make() {// TODO Auto-generated method stubSystem.out.println("make iphone!");}}
PhoneFactory类:手机代工厂(Factory)
public class PhoneFactory {public Phone makePhone(String phoneType) {if(phoneType.equalsIgnoreCase("MiPhone")){return new MiPhone();}else if(phoneType.equalsIgnoreCase("iPhone")) {return new IPhone();}return null;}}
测试
public class Demo {public static void main(String[] arg) {PhoneFactory factory = new PhoneFactory();Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone!IPhone iPhone = (IPhone)factory.makePhone("iPhone"); // make iphone!}}
缺点:
- 由于工厂类集中了所有实例的创建逻辑,违反了高内聚低耦合原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
- 当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
工厂方法
我们要创建一个对象,首先要创建该对象的工厂,用这个对象的工厂去创建这个对象
(说实话,等后面看到具体的例子,我可能才会理解为啥我创建一个对象,前提要去创建这个对象工厂)
AbstractFactory类:生产不同产品的工厂的抽象类
XiaoMiFactory类:生产小米手机的工厂(ConcreteFactory1)public interface AbstractFactory {Phone makePhone();}
AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)public class XiaoMiFactory implements AbstractFactory{@Overridepublic Phone makePhone() {return new MiPhone();}}
测试public class AppleFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new IPhone();}}
public class Demo {public static void main(String[] arg) {AbstractFactory miFactory = new XiaoMiFactory();AbstractFactory appleFactory = new AppleFactory();Phone miPhone = miFactory.makePhone(); // make xiaomi phone!Phone iPhone = appleFactory.makePhone(); // make iphone!}}
