看一个披萨的项目,要便于披萨种类的扩展,要便于维护
package com.itpupil.factory.simplefactory.pizzastore.pizza;
//将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.itpupil.factory.simplefactory.pizzastore.pizza;
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("给制作奶酪披萨,准备原材料");
}
}
package com.itpupil.factory.simplefactory.pizzastore.pizza;
public class GreekPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料");
}
}
package com.itpupil.factory.simplefactory.pizzastore;
import com.itpupil.factory.simplefactory.pizzastore.order.OrderPizza;
//相当于一个客户端,发出订购
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza();
}
}
package com.itpupil.factory.simplefactory.pizzastore.order;
import com.itpupil.factory.simplefactory.pizzastore.pizza.CheesePizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.GreekPizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class OrderPizza {
//构造器
public OrderPizza(){
Pizza pizza = null;
String orderType;
do {
orderType=getType();
if (orderType.equals("greek")){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if(orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else {
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
//写一个方法,可以获取客户端希望订购的披萨种类
private String getType(){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = null;
try {
str = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
str="";
}
return str;
}
}
优点是比较好理解,简单易操作
缺点是违反了设计模式的ocp原则,即对拓展开放,对修改关闭,即当我们给类增加新功能的时候,尽量不要修改代码,或者尽可能少修改代码。
比如我们这时要新增加一个Pizza的种类(XXXX披萨),我们需要作出如下修改
//新增类
public class XPizza extends Pizza{
public void prepare(){
System.out.println("给X披萨准备原材料");
}
}
//OrderPizza类新增if条件
else if(orderType.equals("cheese")){
pizza = new XPizza();
pizza.setName("X披萨");
}
分析:修改代码可以接受,但是如果我们在其他的地方也有创建Pizz的代码,就意味着,也需要修改,而创建pizz的代码,往往有多处。
思路:把创建pizza对象封装到一个类中,这样我们有新的pizza种类时,只需要修改该类就可,其他有创建到Pizza对象的代码就不需要修改了----》简单工厂模式
SimpleFactory类
package com.itpupil.factory.simplefactory.pizzastore.order;
import com.itpupil.factory.simplefactory.pizzastore.pizza.CheesePizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.GreekPizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.Pizza;
//简单工厂类
public class SimpleFactory {
Pizza pizza = null;
public Pizza createPizza(String orderType){
System.out.println("使用简单工厂模式");
if (orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else if (orderType.equals("greek")){
pizza= new GreekPizza();
pizza.setName("希腊披萨");
}
return pizza;
}
}
OrderPizza 类
package com.itpupil.factory.simplefactory.pizzastore.order;
import com.itpupil.factory.simplefactory.pizzastore.pizza.CheesePizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.GreekPizza;
import com.itpupil.factory.simplefactory.pizzastore.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class OrderPizza {
public OrderPizza(SimpleFactory simpleFactory){
setSimpleFactory(simpleFactory);
}
SimpleFactory simpleFactory;
Pizza pizza = null;
public void setSimpleFactory(SimpleFactory simpleFactory){
String orderType="";
this.simpleFactory =simpleFactory;
do {
orderType=getType();
pizza = this.simpleFactory.createPizza(orderType);
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购披萨失败");
break;
}
}while (true);
}
//写一个方法,可以获取客户端希望订购的披萨种类
private String getType(){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = null;
try {
str = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
str="";
}
return str;
}
}
? 工厂模式是对简单工厂模式的进一步抽象化,其好处的可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
? 工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。
其结构如图1所示
//抽象工厂:提供了产品的生成方法
public interface AbstractFactory {
Product createProduct();
}
//产品接口
public interface Product {
public void show();
}
//具体工厂一
public class ConcreteFactory1 implements AbstractFactory{
@Override
public Product createProduct() {
System.out.println("具体工厂1");
return new ConcreteProduct1();
}
}
//具体工厂二
public class ConcreteFactory2 implements AbstractFactory {
@Override
public Product createProduct() {
System.out.println("具体工厂2");
return new ConcreteProduct2();
}
}
//具体产品1
public class ConcreteProduct1 implements Product {
@Override
public void show() {
System.out.println("生成具体产品一");
}
}
//具体产品2
public class ConcreteProduct2 implements Product{
@Override
public void show() {
System.out.println("生产具体产品2");
}
}
//调用
public class App {
public static void main(String[] args) {
AbstractFactory abstractFactory = new ConcreteFactory1();
Product product = abstractFactory.createProduct();
product.show();
}
}
例:pizza
//一个抽象工厂模式的抽象层
public interface AbsFactory {
Pizza createPizza(String orderType);
}
//具体实现类
public class BjFactory implements AbsFactory{
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
switch (orderType){
case "cheese":
pizza = new BjCheesePizza();
break;
case "greek":
pizza = new BjGreekPizza();
break;
}
return pizza;
}
}
//将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;
}
}
public class BjCheesePizza extends Pizza{
@Override
public void prepare() {
setName("北京奶酪披萨");
System.out.println("北京奶酪披萨准备制作");
}
}
? 将实例化对象的代码提取出来,放到一个类中统一管理和维护。达到和主项目的依赖关系的解耦,从而提高项目的拓展和维护性
原文:https://www.cnblogs.com/It-smallstudent/p/14835744.html