纵有疾风起
人生不言弃

设计模式–工厂模式

简单工厂模式

披萨项目:要方便披萨品种的扩展、要便于维护、要能运行时扩展

简单工厂模式的设计方案:定义一个实例化披萨对象的类,封装创建对象的代码

简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为

代码如下:

package com.java.jikexueyuan.pizzastore.simplefactory;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class SimplePizzaFactory {    public Pizza CreatePizza(String ordertype) {        Pizza pizza = null;        if (ordertype.equals("cheese")) {            pizza = new CheesePizza();        } else if (ordertype.equals("greek")) {            pizza = new GreekPizza();        } else if (ordertype.equals("pepper")) {            pizza = new PepperPizza();        }        return pizza;    }}
package com.java.jikexueyuan.pizzastore.pizza;public abstract class Pizza {    protected String name;        public abstract void prepare();    public void bake()    {        System.out.println(name+" baking;");    }    public void cut()    {        System.out.println(name+" cutting;");    }    public void box()    {        System.out.println(name+" boxing;");    }    public void setname(String name)    {        this.name=name;    }}
package com.java.jikexueyuan.pizzastore.pizza;public class CheesePizza extends Pizza {    @Override    public void prepare() {        // TODO Auto-generated method stub        super.setname("CheesePizza");                System.out.println(name+" preparing;");    }}
package com.java.jikexueyuan.pizzastore.simplefactory;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class OrderPizza {    SimplePizzaFactory mSimplePizzaFactory;    public OrderPizza(SimplePizzaFactory mSimplePizzaFactory) {        setFactory(mSimplePizzaFactory);    }    public void setFactory(SimplePizzaFactory mSimplePizzaFactory) {        Pizza pizza = null;        String ordertype;        this.mSimplePizzaFactory = mSimplePizzaFactory;        do {            ordertype = gettype();            pizza = mSimplePizzaFactory.CreatePizza(ordertype);            if (pizza != null) {                pizza.prepare();                pizza.bake();                pizza.cut();                pizza.box();            }        } while (true);    }    private String gettype() {        try {            BufferedReader strin = new BufferedReader(new InputStreamReader(                    System.in));            System.out.println("input pizza type:");            String str = strin.readLine();            return str;        } catch (IOException e) {            e.printStackTrace();            return "";        }    }}

工厂方法模式

披萨项目加盟店

工厂方法模式设计方案:将披萨项目里的披萨对象实例化功能抽象成抽象方法,在不同加盟店具体实现功能。

工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。 工厂方法模式将对象的实例化推迟到子类

代码如下

package com.java.jikexueyuan.pizzastore.method;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.ChinesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public abstract class OrderPizza {    public OrderPizza() {        Pizza pizza = null;        String ordertype;        do {            ordertype = gettype();            pizza = createPizza(ordertype);            pizza.prepare();            pizza.bake();            pizza.cut();            pizza.box();        } while (true);    }    abstract Pizza createPizza(String ordertype);    private String gettype() {        try {            BufferedReader strin = new BufferedReader(new InputStreamReader(                    System.in));            System.out.println("input pizza type:");            String str = strin.readLine();            return str;        } catch (IOException e) {            e.printStackTrace();            return "";        }    }}
package com.java.jikexueyuan.pizzastore.method;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.NYCheesePizza;import com.java.jikexueyuan.pizzastore.pizza.NYPepperPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class NYOrderPizza extends OrderPizza {    @Override    Pizza createPizza(String ordertype) {        Pizza pizza = null;        if (ordertype.equals("cheese")) {            pizza = new NYCheesePizza();        } else if (ordertype.equals("pepper")) {            pizza = new NYPepperPizza();        }        return pizza;    }}
package com.java.jikexueyuan.pizzastore.method;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.LDCheesePizza;import com.java.jikexueyuan.pizzastore.pizza.LDPepperPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class LDOrderPizza extends OrderPizza {    @Override    Pizza createPizza(String ordertype) {        Pizza pizza = null;        if (ordertype.equals("cheese")) {            pizza = new LDCheesePizza();        } else if (ordertype.equals("pepper")) {            pizza = new LDPepperPizza();        }        return pizza;    }}

抽象工厂模式

抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类

package com.java.jikexueyuan.pizzastore.absfactory;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public interface AbsFactory {    public Pizza CreatePizza(String ordertype) ;}
package com.java.jikexueyuan.pizzastore.absfactory;import com.java.jikexueyuan.pizzastore.pizza.LDCheesePizza;import com.java.jikexueyuan.pizzastore.pizza.LDPepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class LDFactory implements AbsFactory {    @Override    public Pizza CreatePizza(String ordertype) {        Pizza pizza = null;        if (ordertype.equals("cheese")) {            pizza = new LDCheesePizza();        } else if (ordertype.equals("pepper")) {            pizza = new LDPepperPizza();        }        return pizza;    }}
package com.java.jikexueyuan.pizzastore.absfactory;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import com.java.jikexueyuan.pizzastore.pizza.CheesePizza;import com.java.jikexueyuan.pizzastore.pizza.GreekPizza;import com.java.jikexueyuan.pizzastore.pizza.PepperPizza;import com.java.jikexueyuan.pizzastore.pizza.Pizza;public class OrderPizza {    AbsFactory mFactory;    public OrderPizza(AbsFactory mFactory) {        setFactory(mFactory);    }    public void setFactory(AbsFactory mFactory) {        Pizza pizza = null;        String ordertype;        this.mFactory = mFactory;        do {            ordertype = gettype();            pizza = mFactory.CreatePizza(ordertype);            if (pizza != null) {                pizza.prepare();                pizza.bake();                pizza.cut();                pizza.box();            }        } while (true);    }    private String gettype() {        try {            BufferedReader strin = new BufferedReader(new InputStreamReader(                    System.in));            System.out.println("input pizza type:");            String str = strin.readLine();            return str;        } catch (IOException e) {            e.printStackTrace();            return "";        }    }}

依赖抽象原则

  变量不要持有具体类的引用

  不要让类继承自具体类,要继承自抽象类或接口 

  不要覆盖基类中已实现的方法

文章转载于:https://www.cnblogs.com/lm970585581/p/9607199.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » 设计模式–工厂模式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录