zoukankan      html  css  js  c++  java
  • 02 工厂模式

    举例制造Pizza的工厂

    简单工厂模式(一般用这种就可以了)

      工厂类里, 通过 if else 来创建不同的具体类. 多个品牌只有一个工厂,通过 if else 来判断制造什么样的Pizza(海鲜Pizza, 榴莲Pizza)

      

    package com.leon.design;
    
    public class SimpleFactory {
    
        public static void main(String[] args) {
            PizzaFactory factory = new PizzaFactory();
            Pizza p1 = factory.CreatePizza("Cheese");
            Pizza p2 = factory.CreatePizza("Greek");
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    class PizzaFactory {
        public Pizza CreatePizza(String s) {
            if (s.equals("Cheese")) {
                return new CheesePizza();
            } else if (s.equals("Greek")) {
                return new GreekPizza();
            }
            return null;
        }
    }

    工厂模式: 每个品牌有自己的制造工厂

    package com.leon.design;
    
    public class StandardFactory {
    
        public static void main(String[] args) {
            CheesePizzaFactory cheeseFactory = new CheesePizzaFactory();
            GreekPizzaFactory greekFactory = new GreekPizzaFactory();
            Pizza p1 = cheeseFactory.CreatePizza();
            Pizza p2 = greekFactory.CreatePizza();
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    class CheesePizzaFactory {
        public Pizza CreatePizza() {
            return new CheesePizza();
        }
    }
    class GreekPizzaFactory {
        public Pizza CreatePizza() {
            return new GreekPizza();
        }
    }

    抽象工厂模式

      定义了一个interface 用于创建相关或有依赖关系的对象族, 而无需指明具体的类.

      简单工厂 + 工厂方法 的结合, 抽象工厂 + 具体实现的工厂子类

      把工厂和产品都要做一个抽象.

      

    package com.leon.design;
    
    public class AbstractFactory {
        public static void main(String[] args) {
            IPizzaFactory factory1 = new CheesePizzaFactory();
            IPizzaFactory factory2 = new GreekPizzaFactory();
            Pizza p1 = factory1.createPizza();
            Pizza p2 = factory2.createPizza();
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    interface IPizzaFactory{
        public Pizza createPizza();
    }
    class CheesePizzaFactory implements IPizzaFactory {
        @Override
        public Pizza createPizza() {    
            return new CheesePizza();
        }
        
    }
    class GreekPizzaFactory implements IPizzaFactory {
        @Override
        public Pizza createPizza() {    
            return new GreekPizza();
        }
    }
  • 相关阅读:
    Hibernate_一对多映射_2
    Hibernate框架_1 单表映射 _2
    JS
    Hibernate框架_1 单表映射
    Spring_1
    Javabean
    JAVA注解(JDK1.5开始)
    JAVA方法的反射
    JAVA-Reflect(反射)1
    Android初学:Gradle 'HelloWorld' project refresh failed
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12497607.html
Copyright © 2011-2022 走看看