一个对象应该只包含单一的职责,并且该职责被完整的封装到一个类中
软件实体应该对扩展开放,对修改关闭
所有引用基类的地方必须能透明的使用其子类对象
高层模块不应该依赖底层模块,他们都应该依赖抽象,抽象不应该依赖细节,细节应该依赖于抽象
客户端不应该依赖他那些不需要的接口
优先使用对象组合,而不是通过继承达到复用的目的
每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
抽象产品: 将要批量生产的对象实体进行一个抽象提取,便于扩展更多实体
public abstract class Product{ //所有产品类的公共业务方法 public void methodSame(){ //公共方法的实现 } //声明抽象业务方法 public abstract void methodDiff(); }具体产品:继承抽象产品,将产品实例化:比如(披萨是抽象产品,实例化产品可以是各种口味的披萨,胡椒味,麻辣味等等)
public class ConcreteProduct extdents Product{ //实现业务方法 public void methodDiff(){ //业务方法的实现 } }工厂类:简单工厂的核心,根据用户传入不同参数来创建不同类型的产品对象。比如(传入胡椒味,创建胡椒味具体的实例对象),若要添加新的产品生产,只用添加一个实体类,在工厂类的静态工厂方法中添加一个else if 即可。
public class Factory{ //静态工厂方法 public static Product getProduct(String arg){ Product product = null; if(arg.equalsIgnoreCase("A")){ product =new ConcreteProductA(); //初识化设置product }else if(arg.equalsIgnoreCase("B")){ product =new ConcreteProductB(); //初始化设置product } return product; } }具体客户端使用:传入不同参数,创建不同实体类
public class Client{ public static void main(String args[]){ Product product; product =Factory.getProduct("A");//通过工厂创建产品对象 product.methodSame(); product.methodDiff(); } } 优点:简单工厂实现了对象创建和使用的分离,客户端无需知道创建的具体类名,只需知道要传的参数即可得到对象。实现了解耦
缺点:使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,扩展困难,一旦实体类多了,要扩张就会修改工厂的逻辑,不利于维护。适用于那种创建对象较少,业务逻辑简单的情况。
(1)Product(抽象产品):它是定义产品的一个接口,是工厂方法模式所创建对象的超类型,公共父类
(2)ConcreteProduct(具体产品):对抽象产品的一个具体实现。
(3)Factory(抽象工厂):声明了一个工厂方法,用于返回一个抽象产品。(核心)
(4)ConcreteFactory(具体工厂) : 是抽象工厂的子类,返回一个具体产品
(1)抽象工厂 :对具体工厂进行的一个统一抽象,便于后面的扩展
public interface Factory{ public Product factoryMethod(); }(2)具体工厂:返回工厂的具体产品
public class ConcreteFactory implements Factory{ public Product factryMethod(){ return new ConcreteProduct(); } }(1)优点 :系统中加入新产品时,只要添加一个具体的工厂和具体产品即可,系统的扩展性提高了,符合开闭原则
(2)缺点: 当产品类增加的时候,要添加的具体工厂类也要随着增加,增加了系统的复杂度,给系统也带来了额外的开销。多了一个抽象工厂,增加了系统的抽象性和理解难度。
抽象工厂类
public interface AbstractFactory{ public AbstractProductA creatProductA();//工厂方法一 public AbstractProductB creatProductB();//工厂方法二 }具体工厂类
public class ConcreteFactory1 implements AbstractFactory{ //工厂方法一 public AbstractProductA creatProductA(){ return new ConcreteProductA1(); } //工厂方法二 public AbstractProductB creatProductB(){ return new ConcreteProductB1(); } }优点:隔离了具体类的生成,使得客户端并不需要知道什么被创建;当一个产品族中的多个对象被设计成一起工作时,它能保证客户端只使用同一个产品族中的对象;增加新产品族很方便,无需修改已有系统,符合开闭原则。
缺点:主要是增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,违背了开闭原则。