简单工厂(创建型)

来源:互联网 发布:mac版华彩人生1点通 编辑:程序博客网 时间:2024/05/03 22:29
简单工厂模式
创建型模式,用于对象的创建,它不属于23种设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

适用场景
1工厂类负责创建的对象比较少
2客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
3由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用

结构类型

优缺点
优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

head_first结构

系统结构


具体产品
-----------------------------------------------------------------------------------------------------
public class ChessPizza extends Pizza {    public ChessPizza(){    this.name="ChessPizza";    }}-----------------------------------------------public class ClamPizza extends Pizza {   public ClamPizza(){  this.name="ClamPizza";   }}


------------------------------------------------------------------------

简单工厂
---------------------------------------------------------------------
public class SimplePizzaFactory {Pizza pizza=null;public Pizza createPizza(String type) {// TODO Auto-generated method stubif(type.equals("chess")){pizza=new ChessPizza();}else if(type.equals("clam")){pizza=new ClamPizza();}return pizza;}}


---------------------------------------------------------------------
抽象产品
--------------------------------------------------------------
public class Pizza {    protected String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void prepare(){  System.out.println("prepare");}public void bake(){System.out.println("bake");} public void box(){System.out.println("box");} public void print(){System.out.println(name);}}


------------------------------------------------------
客户类
-----------------------------------------------------
public class PizaStore {private SimplePizzaFactory simplePizzaFactory;public PizaStore(SimplePizzaFactory simplePizzaFactory){this.simplePizzaFactory=simplePizzaFactory;} public Pizza orderPizza(String type){Pizza pizza;pizza=simplePizzaFactory.createPizza(type);pizza.prepare();pizza.bake();pizza.box();return pizza;}}


-----------------------------------------------------------
测试类
---------------------------------------------------------
public class Testc {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSimplePizzaFactory simplePizzaFactory =new SimplePizzaFactory();PizaStore pizaStore =new PizaStore(simplePizzaFactory);Pizza pizza=pizaStore.orderPizza("chess");pizza.print();}}


-----------------------------------------------------------
测试结果

prepare
bake
box
ChessPizza
0 0